import pandas as pd
from torqueSrc.tools.lambdaDecorator import LambdaDecorator
from torqueSrc.tools.lambdaOptDecorator import CleanDecorator  # 这里用到了用于历史数据优化的 lambdaOptDecorator ！！！!!!!!
from common.config import torqueConfig as Config


from torqueSrc.tools.loadFile import toCsv, toLineRegressAttrCsv, fitLineRegressCsv, inverseCurveFitCsv
import os
import numpy as np
from torqueSrc.torqueHis.torqueHis import torqueHis
from toolsSrc.files.loadFiles import loadfileIndepend


@LambdaDecorator.formulate
def onlLambdaProcess(X):
    print('groupProcess 进行中................')
    return X

# @CleanDecorator.drop_duplicates
@CleanDecorator.drop_bigorsmall
#@CleanDecorator.drop_discretePoint
def onlCleanProcess(X):
    print('cleanProcess 进行中.............')
    return X
def lambdaProcess():
    '''
    1.如果onl是多个文件，采用与lambdaOptProcess相同的方法，分别读取每个文件，找到最大平均Cp maxAveCp，
    2.如果maxAveCp > hisLambdaOptProcess.csv中aveCp，将文件拷贝到 "hisData"文件夹中，重新运行 torqueHis\main.py来更新 hisLambdaOptProcess.csv
    3.进行onl优化程序
    注意：这里的1,2 步骤相当于 二次优化 过程，1。2 过程目前没有进行测试！！！！！！！！！！！！！！！！！！！
    '''
    # 1.
    # 1.1以字典形式读入hisRoot文件夹数据文件{文件名：数据df}
    X = {}
    columsList = [Config.WindSpeed, Config.ActPower, Config.RotateSpeed]
    loadfileIndepend(Config.poolRoot, X, columsList)

    # 1.2遍历字典，对value数据点进行clean
    for key in X.keys():
        X[key] = onlCleanProcess(X[key])

    # 1.3遍历字典，计算平均风能利用系数
    # 1.3.1 计算法风能利用系数平均值
    aveCp = {}
    for key in X.keys():
        X[key]['Cp'] = X[key][Config.ActPower] / X[key][Config.WindSpeed] ** 3
        # aveCp[key] = X[key]['Cp'].mean()
        aveCp[key] = X[key]['Cp'].median()
    print("aveCp_1: ", aveCp)

    # 1.3.2 找到最大平均风能利用系数，返回对应 key
    maxAveCp = 0
    maxAveCpKey = ""
    for key in aveCp.keys():
        if aveCp[key] > maxAveCp:
            maxAveCp = aveCp[key]
            maxAveCpKey = key
    print("maxAveCp: ", maxAveCp)
    print("maxAveCpKey: ", maxAveCpKey)

    # 2.如果maxAveCp > hisLambdaOptProcess.csv中aveCp，将文件拷贝到 "hisData"文件夹中，重新运行 torqueHis\main.py来更新 hisLambdaOptProcess.csv
    df = pd.read_csv(Config.hisLambdaOptProcess)
    if maxAveCp > df[Config.aveCp][0]:
        os.system(f"copy {Config.poolRoot}/maxAveCpKey {Config.historyDataRoot}".replace('/', '\\') + ' /y')
        torqueHis()

    # 3. 进行onl优化
    toCsv(Config.onlCleanProcess, Config.onlLambdaProcess, onlLambdaProcess)
    inverseCurveFitCsv(Config.onlLambdaProcess, Config.onlLambdaProcess, np.array(list(aveCp.values())).mean())  # 曲线拟合
    toLineRegressAttrCsv(Config.onlLambdaProcess, Config.onlLambdaAttr)
    print('groupProcess 完毕................')
    # show3dFig(Config.onlGroupProcess)

if __name__ == '__main__':
    lambdaProcess()